'{$STAMP BS2p}
'{$PBASIC 2.5}
GPS CON 16                 'ENTRADA DEL STRING EN EL PIN 16
DATO VAR Word              'TIPO DE LECTURA
HORA CON 15                'CONSTANTE PARA EL IF
FECHA CON 16               'CONSTANTE PARA EL IF
SC CON 37                  'CONSTANTE PARA EL IF "SIN CRORRECION"
CC CON 38                  'CONSTANTE PARA EL IF "CON CORRECCION"
HR VAR Byte                'HORAS
MN VAR Byte                'MINUTOS
MM VAR Byte                'MES
DD VAR Byte                'DIA
AA VAR Byte                'AÑO
IDX VAR Byte               'INDICE
FLDWIDTH VAR Nib           'BANDERA DE CAMPO
WV VAR Word                'VARIABLE DE TRABAJO
char VAR Byte              'CARACTER PARA PASAR DE ASCII A DECIMAL
N9600 CON $40F0            'VELOCIDAD
NUMERO VAR Byte            'CONTADOR
NU VAR Byte
i VAR Byte
VAR1 VAR Byte
VAR2 VAR Byte
VAR3 VAR Byte
VAR4 VAR Byte
X VAR Byte
'----------------------------------------------------------------------------------------
'----------------------------------------------------------------------------------------
'----------------------------------------------------------------------------------------
MAIN:
    SERIN GPS, N9600, [WAIT("ABC"),DATO]
    DEBUG DATO
    i = 0
    X = 37
    SEROUT 1/0, N9600, ["ABC",HORA]
    DEBUG HORA
    PAUSE 1000
    GOTO TIME
    'SERIN GPS, N9600, [WAIT("ABC"), DEC DATO]
    '  IF DATO = HORA THEN GOTO TIME
    '    IF DATO = FECHA THEN GOTO DATE
    '      IF DATO = SC THEN GOTO SINCORR
    '         IF DATO = CC THEN GOTO SINCORR
    'GOTO NODATA
GOTO MAIN
NODATA:
    SEROUT GPS, N9600, ["NO HAY RESPUESTA",CR]
GOTO MAIN
'----------------------------------------------------------------------------------------
'----------------------------------------------------------------------------------------
'----------------------------------------------------------------------------------------
                                'H    O    R    A
TIME:
    SERIN 1/0, N9600, [WAIT("ABC"), SPSTR 4]
      GOSUB HM
      SEROUT GPS, N9600,[DEC2 HR,":",DEC2 MN,CR]
      IF NOT (HR = 23) AND (MN = 50) THEN GOTO MAIN
GOTO DATE
HM:
  IDX = 0 : FLDWIDTH = 2
    GOSUB LAHORA             'HORA
    HR = WV
  IDX = 2 : FLDWIDTH = 2
    GOSUB LAHORA             'MINUTO
    MN = WV
RETURN
LAHORA:
  WV = 0
  IF (FLDWIDTH < 5) THEN
    DO WHILE (FLDWIDTH > 0)
      WV = WV * 10
      GET IDX, char                   'SUBRUTINA PARA LA HORA
      WV = WV + (char - "0")
      FLDWIDTH = FLDWIDTH - 1
      IDX = IDX + 1
    LOOP
  ENDIF
RETURN
'----------------------------------------------------------------------------------------
'----------------------------------------------------------------------------------------
                             'F    E    C    H    A
DATE:
    SEROUT 1/0, N9600, ["ABC",FECHA]
    PAUSE 1000
    SERIN 1/0, N9600, [WAIT("ABC"), SPSTR 6]
      GOSUB MMDDAA
    SEROUT GPS, N9600,[DEC2 MM,"-",DEC2 DD,"-",DEC2 AA,CR]
GOTO SINCORR
MMDDAA:
  IDX = 0 : FLDWIDTH = 2
  GOSUB LAFECHA             'MES
  MM = WV
  IDX = 2 : FLDWIDTH = 2
  GOSUB LAFECHA             'DIA
  DD = WV
  IDX = 4 : FLDWIDTH = 2
  GOSUB LAFECHA             'AÑO
  AA = WV
RETURN
LAFECHA:
  WV = 0
  IF (FLDWIDTH < 7) THEN
    DO WHILE (FLDWIDTH > 0)
      WV = WV * 10
      GET IDX, char                   'SUBRUTINA PARA LA FECHA
      WV = WV + (char - "0")
      FLDWIDTH = FLDWIDTH - 1
      IDX = IDX + 1
    LOOP
  ENDIF
RETURN
'----------------------------------------------------------------------------------------
'----------------------------------------------------------------------------------------
                                'MEDICIÓN SIN CORRECCIÓN
                                'CONTADOR CARACTERES
SINCORR:
  FOR IDX = 0 TO 10
    PUT IDX,"@"
  NEXT
    SEROUT 1/0, N9600, ["ABC",X]
    PAUSE 1000
    SERIN 1/0, N9600,10000,BAILOUTSC, [WAIT("ABC"), SPSTR 10]
GOTO MAIN
BAILOUTSC:
  NUMERO = 0
  FOR IDX = 0 TO 10
    GET IDX, char
    NUMERO = NUMERO + 1
    PUT 15, NUMERO
    IF char = "@" THEN GOTO OUTSC
  NEXT
GOTO MAIN
OUTSC:
  GET 15,NU
  NU = NU - 1
GOTO COMPARADORSC
COMPARADORSC:
  IF NU = 1 THEN GOTO UNCARACTERSC
    IF NU = 2 THEN GOTO DOSCARACTERESSC
      IF NU = 3 THEN GOTO TRESCARACTERESSC
        IF NU = 5 THEN GOTO CINCOCARACTERESSC
          IF NU = 6  THEN GOTO SEISCARACTERESSC
             IF NU = 7 THEN GOTO SIETECARACTERESSC
                IF NU = 0 THEN GOTO NODATA
GOTO MAIN
CONCORR:
  i = i + 1
  X = X + 1
  IF i = 1 THEN GOTO SINCORR
GOTO MAIN
'----------------------------------------------------------------------------------------
                                   'UN CARACTER
UNCARACTERSC:
  GOSUB GASMET1
  SEROUT GPS, N9600,[DEC1 VAR1,CR]
GOTO CONCORR
GASMET1:
  IDX = 0 : FLDWIDTH = 1
    GOSUB MEDICION1             'VAR1
    VAR1 = WV
RETURN
MEDICION1:
  WV = 0
  IF (FLDWIDTH < 7) THEN
    DO WHILE (FLDWIDTH > 0)
      WV = WV * 10
      GET IDX, char                   'SUBRUTINA MEDICIÓN DE UN CARACTER
      WV = WV + (char - "0")
      FLDWIDTH = FLDWIDTH - 1
      IDX = IDX + 1
    LOOP
  ENDIF
RETURN
'----------------------------------------------------------------------------------------
                              'DOS CARACTERES
DOSCARACTERESSC:
  GOSUB GASMET2
  SEROUT GPS, N9600,[DEC2 VAR1,CR]
GOTO CONCORR
GASMET2:
  IDX = 0 : FLDWIDTH = 2
    GOSUB MEDICION2             'VAR1
    VAR1 = WV
RETURN
MEDICION2:
  WV = 0
  IF (FLDWIDTH < 7) THEN
    DO WHILE (FLDWIDTH > 0)
      WV = WV * 10
      GET IDX, char                   'SUBRUTINA MEDICIÓN DOS CARACTERES
      WV = WV + (char - "0")
      FLDWIDTH = FLDWIDTH - 1
      IDX = IDX + 1
    LOOP
  ENDIF
RETURN
'----------------------------------------------------------------------------------------
                                 'TRESCARACTERES
TRESCARACTERESSC:
  GOSUB GASMET3
  SEROUT GPS, N9600,[DEC2 VAR1,DEC1 VAR2,CR]
GOTO CONCORR
GASMET3:
  IDX = 0 : FLDWIDTH = 2
    GOSUB MEDICION3             'VAR1
    VAR1 = WV
  IDX = 2 : FLDWIDTH = 1
    GOSUB MEDICION3             'VAR2
    VAR2 = WV
RETURN
MEDICION3:
  WV = 0
  IF (FLDWIDTH < 7) THEN
    DO WHILE (FLDWIDTH > 0)
      WV = WV * 10
      GET IDX, char                   'SUBRUTINA MEDICIÓN TRES CARACTERES
      WV = WV + (char - "0")
      FLDWIDTH = FLDWIDTH - 1
      IDX = IDX + 1
    LOOP
  ENDIF
RETURN
'----------------------------------------------------------------------------------------
                               'CINCO CARACTERES
CINCOCARACTERESSC:
  GOSUB GASMET5
  SEROUT GPS, N9600,[DEC2 VAR1,DEC1 VAR2,",",DEC1 VAR3,CR]
GOTO CONCORR
GASMET5:
  IDX = 0 : FLDWIDTH = 2
    GOSUB MEDICION5             'VAR1
    VAR1 = WV
  IDX = 2 : FLDWIDTH = 1
    GOSUB MEDICION5             'VAR2
    VAR2 = WV
  IDX = 4 : FLDWIDTH = 1
    GOSUB MEDICION5             'VAR3
    VAR3 = WV
RETURN
MEDICION5:
  WV = 0
  IF (FLDWIDTH < 7) THEN
    DO WHILE (FLDWIDTH > 0)
      WV = WV * 10
      GET IDX, char                   'SUBRUTINA MEDICION CINCO CARACTERES
      WV = WV + (char - "0")
      FLDWIDTH = FLDWIDTH - 1
      IDX = IDX + 1
    LOOP
  ENDIF
RETURN
'---------------------------------------------------------------------------------------
                           'SEIS CARACTERES
SEISCARACTERESSC:
  GOSUB GASMET6
  SEROUT GPS, N9600,[DEC2 VAR1,DEC1 VAR2,",",DEC2 VAR3,CR]
GOTO CONCORR
GASMET6:
  IDX = 0 : FLDWIDTH = 2
    GOSUB MEDICION6             'VAR1
    VAR1 = WV
  IDX = 2 : FLDWIDTH = 1
    GOSUB MEDICION6             'VAR2
    VAR2 = WV
  IDX = 4 : FLDWIDTH = 2
    GOSUB MEDICION6             'VAR3
    VAR3 = WV
RETURN
MEDICION6:
  WV = 0
  IF (FLDWIDTH < 7) THEN
    DO WHILE (FLDWIDTH > 0)
      WV = WV * 10
      GET IDX, char                   'SUBRUTINA MEDICIÓN SEIS CARACTERES
      WV = WV + (char - "0")
      FLDWIDTH = FLDWIDTH - 1
      IDX = IDX + 1
    LOOP
  ENDIF
RETURN
'----------------------------------------------------------------------------------------
                                'SIETE CARACTERES
SIETECARACTERESSC:
  GOSUB GASMET7
  SEROUT GPS, N9600,[DEC2 VAR1,DEC1 VAR2,",",DEC1 VAR3,DEC2 VAR4,CR]
GOTO CONCORR
GASMET7:
  IDX = 0 : FLDWIDTH = 2
    GOSUB MEDICION7             'VAR1
    VAR1 = WV
  IDX = 2 : FLDWIDTH = 1
    GOSUB MEDICION7             'VAR2
    VAR2 = WV
  IDX = 4 : FLDWIDTH = 1
    GOSUB MEDICION7             'VAR3
    VAR3 = WV
  IDX = 5 : FLDWIDTH = 2
    GOSUB MEDICION7             'VAR4
    VAR4 = WV
RETURN
MEDICION7:
  WV = 0
  IF (FLDWIDTH < 7) THEN
    DO WHILE (FLDWIDTH > 0)
      WV = WV * 10
      GET IDX, char                   'SUBRUTINA PARA LA FECHA
      WV = WV + (char - "0")
      FLDWIDTH = FLDWIDTH - 1
      IDX = IDX + 1
    LOOP
  ENDIF
RETURN
'----------------------------------------------------------------------------------------
'---------------------------------------------------------------------------------------- 